package 快速排序;

public class quick2 {
    public static void main(String[] args) {
        //1.定义基本数组
        int[] a = {12,34,27,32,14};
        //2.定义快速排序的方法和参数
        quickSort(a,0,a.length-1);
         //5.for循环遍历数组结果
         for (int n:a
             ) {
            System.out.println(n);
        }

    }
   //3
    private static void quickSort(int[] a, int low, int high) {
        if(low<high){ //排序前提
            //声明并获取索引
            int index = getIndex(a, low, high);//参数：数组名+low+high
            //索引迭代前后
            quickSort(a, low, index-1);
            quickSort(a, index+1, high);

        }
    }
    //4.
    private static int getIndex(int[] a, int low, int high) { //需要返回int类型数据
        //声明low基准变量
        int tmp = a[low];//基准数据
        //while里面两个while循环
        while (low<high){
            // 当a[high]队尾元素 大于等于 tmp基准数据时,向前挪动high指针
            while(low<high && a[high]>=tmp){
                high--;// 对应：index-1
            }
            // 如果队尾元素 小于tmp了,需要将其赋值给low
            a[low] =a[high];

            // 当队首元素 小于等于 tmp基准数据时,向后挪动low指针
            while (low<high && a[low] <= tmp){
                low++;// 对应：index+1
            }
            // 当队首元素 大于tmp时,需要将其赋值给high
            a[high]  = a[low];

        }
        // 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置

        a[low] = tmp; //将tmp赋值给a[low]
        return low; // 返回tmp的正确位置
    }

}
